今天要來學習HTML5 Canvas(畫布),並且加上一些酷東西
<canvas> 是一個 HTML 元素,我們可以利用程式腳本在這個元素上繪圖(通常是用 JavaScript)
它有點像 <img> 元素,其中的差異點在於 <canvas>沒有 src 和 alt 屬性,只有 width 與 height 這兩個屬性,這兩個屬性皆為非必須、能透過 DOM屬性設定;若是沒有設定 width 和 height 屬性,畫布寬預設值為 300 pixels、高預設值為 150 pixels,我們可以用 CSS 強制設定元素尺寸,但當渲染時,影像會縮放以符合元素的尺寸。
const canvas = document.querySelector('#draw');
const ctx = canvas.getContext('2d')
// resize canvas
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
呼叫document.getElementById()來取得<canvas>元素,然後用getContext()取得渲染環境。
我們可以取得視窗的width和height,然後重設canvas的大小。
<canvas>產生一個固定大小的繪圖畫布,這個畫布上有一或多個渲染環境(rendering context),我們可以用渲染環境來產生或操作顯示內容的渲染環境(rendering context)
ctx.strokeStyle = '#blue';
ctx.lineJoin = 'round';
ctx.lineCap = 'round';
strokeStyle 用於設置畫筆顏色
lineJoin 設置兩條直線交匯時,形成的邊角
lineCap 用於設置線條末端線帽的樣式
let isDrawing = false;
let lastX = 0; //游標最後的X座標
let lastY = 0; //游標最後的Y座標 
對繪製圖型所需的資訊進行初始設定
function draw(e) {
    if (!isDrawing) return; // 滑鼠未點擊時停止偵測
    console.log(e);
    ctx.beginPath();
    //start from
    ctx.moveTo(lastX, lastY);
    //go to
    ctx.lineTo(e.offsetX, e.offsetY);
    //draw
    ctx.stroke();
    [lastX, lastY] = [e.offsetX, e.offsetY]; //解構賦值
}
beginPath()是 Canvas 2D API 通過清空子路徑列表開始一個新路徑的方法,當你想創建一個新的路徑時,使用此方法
moveTo()是 Canvas 2D API 將一個新的子路徑的起始點移動到(x,y)坐標的方法
ineTo()是 Canvas 2D API 使用直線連接子路徑的終點到x,y坐標的方法(並不會真正地繪製)
stroke()是 Canvas 2D API 使用非零環繞規則,根據當前的畫線樣式,繪製當前或已經存在的路徑的方法
解構賦值 (Destructuring assignment) 語法是一種 JavaScript 運算式,是一個在ES6的新特性,可以把陣列或物件中的資料解開擷取成為獨立變數
canvas.addEventListener('mousedown', (e) => {
    isDrawing = true;
    [lastX, lastY] = [e.offsetX, e.offsetY];
});
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', () => isDrawing = false);
canvas.addEventListener('mouseout', () => isDrawing = false); // 滑鼠未在canvas內
最後再加上事件監聽器就完成了
幫繪出的線條加上一點裝飾
let hue = 1;
let direction = true;
function draw(e) {
		//接續上方程式
		ctx.strokeStyle = `hsl(${hue}, 100%, 50%)`
    if (hue > 360 || hue < 1) {
        direction = !direction;
    }
    if (direction) {
        hue++;
        console.log('++');
    } else {
        hue--;
        console.log('--');
    }
}
hsl(hue, saturation, lightness):H 為 hue(色相)、S 為 saturation(飽合度)、L 為 lightness(亮度)
效果可參考下方連結
參考:https://mothereffinghsl.com/